package com.mfn.sportjava.util;

import cn.hutool.core.io.IoUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.mfn.sportjava.model.dto.MatchDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author Anyang
 * @version 1.0.0
 * @date 2025/04/13 08:04:11
 * @description
 * @className java.lang.String
 */
public class FileUtil {

    private static final Logger log = LoggerFactory.getLogger(FileUtil.class);

    /**
     * 将JSON文件（以InputStream形式提供）解析为MatchDTO对象列表。
     * @param inputStream JSON文件的InputStream。
     * @return 从JSON解析出的MatchDTO对象列表。如果解析失败或数组为空，则返回空列表。
     * @throws RuntimeException 如果读取输入流失败或JSON解析遇到严重错误。
     */
    public static List<MatchDTO> parseJsonFile(InputStream inputStream) {
        String jsonContent;
        try {
            jsonContent = IoUtil.read(inputStream, StandardCharsets.UTF_8);
            // 记录内容开头部分
            log.debug("读取的JSON内容: {}", jsonContent.substring(0, Math.min(jsonContent.length(), 500)) + "...");
        } catch (Exception e) {
            log.error("读取输入流失败。", e);
            throw new RuntimeException("无法读取文件内容 (Failed to read file content)", e);
        }

        if (jsonContent.isBlank()) {
            log.warn("读取后JSON内容为空或空白。");
            return Collections.emptyList();
        }

        try {
            // 将JSON字符串解析为JSONArray
            JSONArray jsonArray = JSONUtil.parseArray(jsonContent);
            List<MatchDTO> matches = new ArrayList<>();

            // 遍历数组中的每个JSON对象
            for (Object obj : jsonArray) {
                if (obj instanceof JSONObject jsonObject) {
                    // 创建一个新的MatchDTO并从JSONObject填充数据
                    MatchDTO match = new MatchDTO();
                    // 使用getStr进行安全的字符串获取（如果键不存在或不是字符串，则返回null）
                    match.setLeague(jsonObject.getStr("league"));
                    match.setMatch(jsonObject.getStr("match"));
                    match.setDate(jsonObject.getStr("date"));
                    match.setTime(jsonObject.getStr("time"));

                    // 检查是否包含必要字段
                    if (match.getLeague() == null || match.getMatch() == null || match.getDate() == null || match.getTime() == null) {
                        log.warn("由于缺少字段，跳过JSON对象: {}", jsonObject);
                        continue; // 如果缺少必要数据，则跳过此条目
                    }

                    matches.add(match);
                } else {
                    log.warn("跳过JSON数组中的非JSONObject元素: {}", obj);
                }
            }
            log.info("成功从JSON中解析了 {} 条比赛记录。", matches.size());
            return matches;

        } catch (Exception e) {
            log.error("解析JSON内容失败: {}", jsonContent, e);
            throw new IllegalArgumentException("JSON 文件格式错误或无法解析", e);
        }
    }
}